%%
%% Echo proces
%%
-module(echo_proc).
-export([init/0, start/0, stop/1, do_echo/2]).
 
%%
%% funkce pro vypinani a zapinani procesu
%%
 
% zapnuti procesu
start() ->
	debug_msg("start"),
	spawn (echo_proc, init, []).
 
% vypnuti procesu
stop(Pid) ->
	debug_msg ("sending stop"),
	Pid ! stop,
	ok.
 
%%
%% uzivatelelske API
%%
 
% odeslani dat a prijmuti odpovedi
do_echo (Pid, ReqData) ->
	debug_msg ("sending request"),
	Pid ! {request, self(), ReqData},
	debug_msg ("waiting for reply"),
	receive
		{response, RespData} ->
			debug_msg ("recieve reply"),
			{ok, RespData}
	after 1000 ->
		debug_msg ("reply timeout"),
		timeout
	end.
 
%%
%% interni funkce souvisejici s fungovanim procesu
%%
 
% inicializacni funkce
init() ->
	debug_msg("init"),
	loop().
 
% hlavni cyklus
loop() ->
	debug_msg ("waiting for message"),
	receive
		% echo pozadavek
		{request, From, RequestData} ->
			debug_msg ("recieve request"),
			ResponseData = RequestData,   % echo server - zasila se zpatky co prislo
			debug_msg ("sending response"),
			From ! {response, ResponseData},
		loop ();
 
		% zadost o zastaveni procesu
		stop ->
			debug_msg ("recieve stop"),
			terminate();
 
		% osetreni neocekavane zpravy ve fronte
		Other ->
			io:format("unexpected message ~w~n", [Other]),
		loop ()
	end.
 
% ukoncovaci funkce
terminate() ->
	debug_msg("terminate"),
	ok.
 
%%
%% lokalni pomocne funkce
%%
 
% vypis ladicich vypisu
debug_msg (Text) ->
	io:format("[~w] ~s~n", [self(), Text]).
